// ----------------------------------
// RSDK Project: Sonic 1/Sonic 2
// Script Description: Monitor Object
// Script Author: Christian Whitehead/Simon Thomley
// Unpacked by Rubberduckycooly's script unpacker
// ----------------------------------

//-------Aliases-------//
private alias 13 : TYPE_MONITOR
public alias saveRAM[290] : saved.randomMonitor

// Function declarations
reserve function Monitor_DebugDraw
reserve function Monitor_DebugSpawn
reserve function Monitor_SolidBox

// Static Values
public value Monitor_value24 = 0;

// Tables
public table Monitor_table15
	1, 2, 3, 4, 5, 12, 1, 1, 2, 1
end table

public table Monitor_table14
	1, 2, 3, 4, 5, 9, 10, 11, 12, 1
end table

public table Target_Table_Pos
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
end table

public table Target_Table_Dist
	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
end table

function Monitor_DebugDraw
	DrawSprite(0)
	temp0 = object[0].value17
	temp0 -= Monitor_value24
	if temp0 == 5
		temp0 += stage.playerListPos
		if temp0 == 10
			temp0 = 5
		end if
	else
		if temp0 > 5
			temp0 += 2
		end if
	end if
	if temp0 > 12
		CheckCurrentStageFolder("Zone04")
		if checkResult == 0
			temp0++
		end if
	end if
	DrawSprite(temp0)
end function


function Monitor_DebugSpawn
	temp0 = object[0].value17
	temp0 -= Monitor_value24
	if temp0 == 5
		temp0 += stage.playerListPos
		if temp0 == 10
			temp0 = 5
		end if
	else
		if temp0 > 5
			temp0 += 2
		end if
	end if
	if temp0 > 12
		CheckCurrentStageFolder("Zone04")
		if checkResult == 0
			temp0++
		end if
	end if
	CreateTempObject(TypeName[Monitor], temp0, object.xpos, object.ypos)
end function

function Monitor_SolidBox
	temp0 = object[currentPlayer].xpos
	temp1 = object[currentPlayer].ypos
	BoxCollisionTest(C_BOX, object.entityPos, -15, -14, 15, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
	temp2 = object[currentPlayer].xpos
	object[currentPlayer].xpos = temp0
	object[currentPlayer].ypos = temp1
	switch checkResult
	case 4
		if object[currentPlayer].gravity == GRAVITY_AIR
			object.state = 1
			object.yvel = -0x20000
			object[currentPlayer].yvel = 0x20000
		end if
	case 2
		temp2 += 0x10000
		object[currentPlayer].xpos = temp2		
		BoxCollisionTest(C_BOX, object.entityPos, -15, -10, 15, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
		if checkResult == 0
			object[currentPlayer].xpos = temp0
		end if
		break
	case 3
		temp2 -= 0x10000
		object[currentPlayer].xpos = temp2		
		BoxCollisionTest(C_BOX, object.entityPos, -15, -10, 15, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
		if checkResult == 0
			object[currentPlayer].xpos = temp0
		end if
		break
	case 1
		BoxCollisionTest(C_BOX, object.entityPos, -15, -14, 15, 16, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
		break
	end switch
end function

event ObjectMain
	if object.state == 1
		object.yvel += 0x3800
		object.ypos += object.yvel
		if object.yvel >= 0
			ObjectTileCollision(CSIDE_FLOOR, 0, 16, 0)
			if checkResult == 1
				object.yvel = 0
				object.state = 0
			end if
		end if
	end if

	if stage.playerListPos == 6
		if saved.gogoplus > 0
			temp0 = 0
			temp1 = object.xpos
			temp1 >>= 16
			temp1 -= screen.xoffset
			temp1 += 0x20
			temp2 = object.ypos
			temp2 >>= 16
			temp2 -= screen.yoffset
			temp2 += 0x20
			temp3 = 0
			temp4 = screen.xsize
			temp4 += 0x40
			temp5 = screen.ysize
			temp5 += 0x40
			
			
			if temp1 >= 0
				if temp1 <= temp4
					if temp2 >= 0
						if temp2 <= temp5
							temp3 = 1
						end if
					end if
				end if
			end if
			
			if temp3 == 1
				foreach (TypeName[Insta Shield], arrayPos0, ALL_ENTITIES)
					switch object[arrayPos0].propertyValue
						case 1
						case 3
							temp0 = 1
							break
						case 2
							if arrayPos0 == 13
								if object[arrayPos0].state < 3
									CheckEqual(object.entityPos, object[13].value15)
									temp3 = checkResult
									CheckEqual(object.entityPos, object[14].value15)
									temp3 |= checkResult
									CheckEqual(object.entityPos, object[15].value15)
									temp3 |= checkResult
									CheckEqual(object.entityPos, object[16].value15)
									temp3 |= checkResult
									
									if temp3 == 0
										temp0 = 0
										temp2 = 0
										while temp0 < 22
											if temp2 == 0
												GetTableValue(temp1, temp0, Target_Table_Pos)
												if temp1 == object.entityPos
													temp4 = object.xpos
													temp4 -= object[0].xpos
													Abs(temp4)
													temp4 >>= 19
													temp4 *= temp4
													
													temp5 = object.ypos
													temp5 -= object[0].ypos
													Abs(temp5)
													temp5 >>= 19
													temp5 *= temp5
													temp4 += temp5
													
													SetTableValue(temp4, temp0, Target_Table_Dist)
													temp2 = 1
												end if
											end if	
										temp0++
										loop
										
										if temp2 == 0
											temp4 = object.xpos
											temp4 -= object[0].xpos
											Abs(temp4)
											temp4 >>= 19
											temp4 *= temp4
											
											temp5 = object.ypos
											temp5 -= object[0].ypos
											Abs(temp5)
											temp5 >>= 19
											temp5 *= temp5
											temp4 += temp5
													
											SetTableValue(temp4, 21, Target_Table_Dist)
											SetTableValue(object.entityPos, 21, Target_Table_Pos)
										end if
										
										temp0 = 0
										while temp0 < 22
											temp1 = temp0
											temp1++
											while temp1 < 22
												GetTableValue(temp6, temp0, Target_Table_Dist)
												GetTableValue(temp7, temp1, Target_Table_Dist)
												CheckGreater(temp6, temp7)
												temp4 = checkResult
												CheckEqual(temp6, 0)
												temp4 |= checkResult
												if temp4 == 1
													temp5 = temp6
													temp6 = temp7
													temp7 = temp5
													SetTableValue(temp6, temp0, Target_Table_Dist)
													SetTableValue(temp7, temp1, Target_Table_Dist)
													GetTableValue(temp6, temp0, Target_Table_Pos)
													GetTableValue(temp7, temp1, Target_Table_Pos)
													temp5 = temp6
													temp6 = temp7
													temp7 = temp5
													SetTableValue(temp6, temp0, Target_Table_Pos)
													SetTableValue(temp7, temp1, Target_Table_Pos)
												end if			
												temp1++
											loop
											temp0++
										loop
									end if
								end if
							end if
							if object[arrayPos0].state == 2
								if object[arrayPos0].value15 == object.entityPos
									BoxCollisionTest(C_TOUCH, arrayPos0, -8, -8, 8, 8, object.entityPos, -8, -8, 8, 8)
									if checkResult == 1
										arrayPos1 = arrayPos0
										arrayPos1++
										if arrayPos1 > 16
											arrayPos1 = 13
										end if
										object[arrayPos0].state = 0
										object[arrayPos0].value15 = 0
										temp0 = 1
									end if
								end if
							end if
							break
					end switch
				next
			else
				temp0 = 0	
			end if
		else
			temp0 = 0
		end if	
		
		if temp0 == 1
			object.state = 0
			CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)
			object[tempObjectPos].drawOrder = 4
			object.type = TypeName[Broken Monitor]
			if object.priority != PRIORITY_XBOUNDS_DESTROY
				object.priority = PRIORITY_ACTIVE
			end if
			object.alpha = 255
			object.value0 = object.ypos
			object.value1 = -0x30000
			PlaySfx(SfxName[Destroy], 0)
			if object.propertyValue == 14
				Rand(temp0, 10)
				if saved.elemental == 1
					GetTableValue(object.propertyValue, temp0, Monitor_table14)
				else
					GetTableValue(object.propertyValue, temp0, Monitor_table15)
				end if
			end if	
		end if	
	end if	
	
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		CheckGreater(object[currentPlayer].yvel, -1)
		temp0 = checkResult
		CheckEqual(object[currentPlayer].gravity, GRAVITY_GROUND)
		temp0 |= checkResult
		if temp0 == 1
			CheckEqual(object[currentPlayer].animation, ANI_JUMPING)
			temp0 = checkResult
			CheckEqual(object[currentPlayer].animation, ANI_GLIDING)
			temp0 |= checkResult
			CheckEqual(object[currentPlayer].animation, ANI_GLIDING_STOP)
			temp0 |= checkResult
			CheckEqual(object[currentPlayer].animation, ANI_HAMMER_SPEEN)
			temp0 |= checkResult
			CheckEqual(object[currentPlayer].state, PlayerObject_HandleAttack)
			temp0 |= checkResult
			
			if temp0 == 1
				if object[currentPlayer].value16 == 0
					BoxCollisionTest(C_TOUCH, object.entityPos, -15, -14, 15, 16, currentPlayer, object[currentPlayer].value40, object[currentPlayer].value38, object[currentPlayer].value41, object[currentPlayer].value39)
					if checkResult == 1
						object.state = 0
						CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)
						object[tempObjectPos].drawOrder = 4
						object[currentPlayer].yvel += object[currentPlayer].value25
						object[currentPlayer].yvel += object[currentPlayer].value25
						FlipSign(object[currentPlayer].yvel)
						object.type = TypeName[Broken Monitor]
						if object.priority != PRIORITY_XBOUNDS_DESTROY
							object.priority = PRIORITY_ACTIVE
						end if
						object.alpha = 255
						object.value0 = object.ypos
						object.value1 = -0x30000
						PlaySfx(SfxName[Destroy], 0)
						if object.propertyValue == 14
							Rand(temp0, 10)
							if saved.elemental == 1
								GetTableValue(object.propertyValue, temp0, Monitor_table14)
							else
								GetTableValue(object.propertyValue, temp0, Monitor_table15)
							end if
							if object.propertyValue == 5
								if stage.playerListPos == 1
									object.propertyValue = 6
								end if
								
								if stage.playerListPos == 2
									object[arrayPos0].propertyValue = 7
								end if
							end if
						end if	
					end if
				else
					CallFunction(Monitor_SolidBox)
				end if
			else
				CallFunction(Monitor_SolidBox)
			end if
		else
			CallFunction(Monitor_SolidBox)
		end if
	next


	foreach (TypeName[Bullet], arrayPos0, ACTIVE_ENTITIES)
		BoxCollisionTest(C_TOUCH, object.entityPos, -15, -14, 15, 16, arrayPos0, -6, -4, 6, 4)
		if checkResult == 1
			object.state = 0
			CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)
			object[tempObjectPos].drawOrder = 4
			object.type = TypeName[Broken Monitor]
			if object.priority != PRIORITY_XBOUNDS_DESTROY
				object.priority = PRIORITY_ACTIVE
			end if
			object.alpha = 255
			object.value0 = object.ypos
			object.value1 = -0x30000
			PlaySfx(SfxName[Destroy], 0)
			if object.propertyValue == 14
				Rand(temp0, 10)
				if saved.elemental == 1
					GetTableValue(object.propertyValue, temp0, Monitor_table14)
				else
					GetTableValue(object.propertyValue, temp0, Monitor_table15)
				end if
				if object.propertyValue == 5
					if stage.playerListPos == 1
						object.propertyValue = 6
					end if
					
					if stage.playerListPos == 2
						object[arrayPos0].propertyValue = 7
					end if
				end if
			end if	
		end if
	next	
	if stage.playerListPos == 6
		foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
			if object[arrayPos0].propertyValue == 13
				object[arrayPos0].type = TypeName[Blank Object]
			end if
		next
	end if	
end event


event ObjectDraw
	DrawSprite(0)
	if object.propertyValue == 17
		temp0 = StageSetup_value22
		temp0 >>= 1
		temp0 %= 3
		switch temp0
			case 0
				DrawSprite(17)
				break
			case 1
				DrawSprite(18)
				break
			case 2
				DrawSprite(19)
				break
		end switch
	else
		switch StageSetup_value22
		case 0
		case 1
			DrawSprite(17)
			break
		case 6
		case 7
			DrawSprite(18)
			break
		case 12
		case 13
			DrawSprite(19)
			break
		default
			DrawSprite(object.propertyValue)
		end switch
	end if
end event


event ObjectStartup
	LoadSpriteSheet("Global/Items.gif")
	SpriteFrame(-16, -16, 32, 32, 18, 1) // 0
	SpriteFrame(-8, -9, 16, 14, 51, 16) // 1
	SpriteFrame(-8, -9, 16, 14, 68, 16) // 2
	SpriteFrame(-8, -9, 16, 14, 51, 31) // 3
	SpriteFrame(-8, -9, 16, 14, 68, 31) // 4
	if options.gameMode == 3
		SpriteFrame(-8, -9, 16, 14, 166, 118) // 5
		SpriteFrame(-8, -9, 16, 14, 166, 118) // 6
		SpriteFrame(-8, -9, 16, 14, 166, 118) // 7
	else
		if stage.playerListPos == 5
			SpriteFrame(-8, -9, 16, 14, 35, 100)
		end if

		if stage.playerListPos <= 4
			SpriteFrame(-8, -9, 16, 14, 51, 46)
		end if

		if stage.playerListPos == 6
		SpriteFrame(-8, -10, 16, 16, 118, 92) // 9 Shadow
		end if

		SpriteFrame(-8, -9, 16, 14, 68, 46) // 9
		SpriteFrame(-8, -9, 16, 14, 51, 61) // 10
	end if		
	SpriteFrame(-8, -9, 16, 14, 68, 61) // 10
	SpriteFrame(-8, -9, 16, 14, 51, 91) // 11
	SpriteFrame(-8, -9, 16, 14, 68, 76) // 12
	SpriteFrame(-8, -9, 16, 14, 51, 76) // 13
	SpriteFrame(-8, -9, 16, 14, 68, 91) // 14
	SpriteFrame(-8, -9, 16, 14, 18, 100) // 15
	SpriteFrame(-8, -9, 16, 14, 117, 26) // 16
	SpriteFrame(-8, -9, 16, 14, 117, 41) // 17
	SpriteFrame(-8, -9, 16, 14, 117, 56) // 18
									 
	SpriteFrame(-8, -9, 16, 14, 51, 1) // 19
	SpriteFrame(-8, -9, 16, 14, 68, 1) // 20
	SpriteFrame(-8, -9, 16, 14, 117, 71) // 21
	temp0 = 0
	Monitor_value24 = DebugMode_ObjCount
	Monitor_value24--
	while temp0 < 16
		temp2 = 1
		if temp0 >= 4
			if temp0 <= 6
				temp1 = temp0
				temp1 -= 4
				temp3 = stage.playerListPos
				if temp3 == 5
					temp3 = 0
				end if
				if temp3 != temp1
					temp2 = 0
				end if
			end if
		end if
		if temp0 == 12
			CheckCurrentStageFolder("Zone04")
			if checkResult == 0
				temp2 = 0
			end if
		end if
		if temp2 == 1
			SetTableValue(TypeName[Monitor], DebugMode_ObjCount, DebugMode_TypesTable)
			SetTableValue(Monitor_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
			SetTableValue(Monitor_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
			DebugMode_ObjCount++
		end if
		temp0++
	loop
	CheckEqual(saved.elemental, 0)
	temp0 = checkResult
	CheckEqual(options.attractMode, 1)
	temp0 |= checkResult
	if temp0 == 1
		switch stage.listPos
		case 12
		case 13
		case 17
			foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
				if object[arrayPos0].propertyValue >= 9
					if object[arrayPos0].propertyValue <= 11
						object[arrayPos0].type = TypeName[Blank Object]
					end if
				end if
			next
			break
		default
			foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
				if object[arrayPos0].propertyValue >= 9
					if object[arrayPos0].propertyValue <= 11
						object[arrayPos0].propertyValue = 2
					end if
				end if
			next
		end switch
	end if
	switch options.gameMode
		case 2
			foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
				//if object[arrayPos0].propertyValue == 5
				switch object[arrayPos0].propertyValue
					case 5
					case 6
					case 7
						object[arrayPos0].type = TypeName[Blank Object]
				end switch
				//end if
			next
			break
		case 3
			break
		default
			if saved.lives == 1
				foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
					switch object[arrayPos0].propertyValue
						case 5
						case 6
						case 7
							object[arrayPos0].propertyValue = 1
					end switch
				next
			else
				if stage.playerListPos == 1
					foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
						if object[arrayPos0].propertyValue == 5
							object[arrayPos0].propertyValue = 6
						end if
					next
				end if
				if stage.playerListPos == 2
					foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
						if object[arrayPos0].propertyValue == 5
							object[arrayPos0].propertyValue = 7
						end if
					next
				end if
			end if
			break
	end switch
	if saved.randomMonitor == 1
		if options.attractMode == 0
			if options.gameMode < 2 
				foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)
					object[arrayPos0].propertyValue = 14
				next
			end if
		end if
	end if
end event

event RSDKDraw
	DrawSprite(0)
	DrawSprite(object.propertyValue)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Items.gif")
	SpriteFrame(-16, -16, 32, 32, 18, 1)
	SpriteFrame(-8, -9, 16, 14, 51, 16)
	SpriteFrame(-8, -9, 16, 14, 68, 16)
	SpriteFrame(-8, -9, 16, 14, 51, 31)
	SpriteFrame(-8, -9, 16, 14, 68, 31)
	SpriteFrame(-8, -9, 16, 14, 51, 46)
	SpriteFrame(-8, -9, 16, 14, 68, 46)
	SpriteFrame(-8, -9, 16, 14, 51, 61)
	SpriteFrame(-8, -9, 16, 14, 68, 61)
	SpriteFrame(-8, -9, 16, 14, 51, 91)
	SpriteFrame(-8, -9, 16, 14, 68, 76)
	SpriteFrame(-8, -9, 16, 14, 51, 76)
	SpriteFrame(-8, -9, 16, 14, 68, 91)
	SpriteFrame(-8, -9, 16, 14, 18, 100)
	SpriteFrame(-8, -9, 16, 14, 117, 26)
	SpriteFrame(-8, -9, 16, 14, 117, 41)
	SpriteFrame(-8, -9, 16, 14, 117, 56)
									 
	SpriteFrame(-8, -9, 16, 14, 51, 1)
	SpriteFrame(-8, -9, 16, 14, 68, 1)
	SpriteFrame(-8, -9, 16, 14, 117, 71)
end event
